# 导入Django原生的User模型
from django.contrib.auth.models import User

from rest_framework import generics
from django.contrib.auth import authenticate
from django.contrib.auth.models import User

from rest_framework import generics, status
from rest_framework.views import APIView
from rest_framework.response import Response

from .serializers import UserSerializer  # 这个序列化器暂时还没有编写


# 编写创建用户的视图
class UserCreate(generics.CreateAPIView):
    name = 'user_create'

    # 配置要使用的认证类，可以用如下方式配置（类属性方式）
    # authentication_classes = ()
    # 也可以用如下方式配置（实例方法）
    def get_authenticators(self):
        return ()  # 返回一个空的元组，表是从全局认证方式中豁免

    # 配置要使用的权限为，可以使用类属性，也可以使用方法
    # permission_classes = ()
    def get_permissions(self):
        return ()    # 返回一个空的元组，表是从全局认证方式中豁免

    def get_serializer_class(self):
        return UserSerializer  # 这个序列化器暂时还没有编写

class UserList(generics.ListAPIView):
    # 略，一般来说不须要拉取用户列表，但读者可以编写它
    pass


class UserRetrieve(generics.RetrieveAPIView):
    # 略，不须要拉取用户信息，但读者可以编写它
    pass

class LoginView(APIView):
    name = 'login'

    # 对用户登录进行权限管理，使用这个API不须要是已认证过的，所以从全局权限限制中豁免
    # permission_classes = ()
    def get_permissions(self):
        return ()

    def post(self, request):
        username = request.data.get('username')
        password = request.data.get('password')
        user = authenticate(username=username, password=password)  # 对用户名和密码进行认证，如果认证成功，则返回这个用户的实例
        if user:
            # 认证成功，从Token表中返回该用户的token
            return Response(
                data={
                    'token': user.auth_token.key,
                }
            )
        else:
            # 认证失败，则返回相关信息和状态码
            return Response(
                data={
                    'error': '认证失败，请确认账号和密码是否正确',
                },
                status=status.HTTP_400_BAD_REQUEST,
            )